// 购物车模块

import { getNewCartGoods, mergeCart, findCart, insertCart, deleteCart, updateCart, checkAllCart } from '@/api/cart'
export default {
  namespaced: true,
  state () {
    return {
      list: []
    }
  },
  getters: {
    // 有效列表
    validList (state) {
      return state.list.filter(goods => {
        return goods.stock > 0 && goods.isEffective
      })
    },
    // 有效商品总件数
    validTotal (state, getters) {
      return getters.validList.reduce((p, c) => {
        return p + c.count
      }, 0)
    },
    // 有效商品总金额
    validAmount (state, getters) {
      return getters.validList.reduce((p, c) => p + c.count * 100 * c.nowPrice, 0) / 100
    },
    // 无效商品列表
    inValidList (state) {
      return state.list.filter(goods => {
        return goods.stock <= 0 || !goods.isEffective
      })
    },
    // 已选择商品列表
    selectedList (state, getters) {
      return getters.validList.filter(item => item.selected === true)
    },
    // 已选商品件数
    selectedTotal (state, getters) {
      return getters.selectedList.reduce((p, c) => p + c.count, 0)
    },
    // 已选商品总金额
    selectedAmount (state, getters) {
      return getters.selectedList.reduce((p, c) => p + (c.count * Math.round(c.nowPrice * 100)), 0) / 100
    },
    // 是否全选
    isCheckAll (state, getters) {
      return getters.selectedList.length !== 0 && getters.selectedList.length === getters.validList.length
    }
  },
  mutations: {
    // 加入购物车
    insertCart (state, payload) {
      // 约定加入购物车字段必须和后端保持一致
    // 它们是: id skuId,name,attrsText,picture,price,nowPrice,selected,stock,count,discount,isCollect,isEffective
    // 插入数据规则:先找是否有相同的商品
    // 有相同商品，查询数量,合并到payload上，在保存
    // 没有相同商品，保存到最新位置
      const sameIndex = state.list.findIndex(goods => goods.skuId === payload.skuId)
      if (sameIndex > -1) {
        const count = state.list[sameIndex].count
        payload.count += count
        // 删除原有商品
        state.list.splice(sameIndex, 1)
        // 追加新的
        state.list.unshift(payload)
      } else {
        state.list.unshift(payload)
      }
    },
    // 修改购物车商品
    updateCart (state, goods) {
      // goods是商品信息 nowPrice stock isEffective
      // goods 商品对象字段不固定，对象中有哪些字段改哪些字段,字段的值合理
      const updateGoods = state.list.find(item => item.skuId === goods.skuId)
      for (const key in goods) {
        if (goods[key] !== undefined && goods[key] !== null && goods[key] !== '') {
          updateGoods[key] = goods[key]
        }
      }
    },
    // 删除购物车商品
    deleteCart (state, skuId) {
      const index = state.list.findIndex(item => item.skuId === skuId)
      state.list.splice(index, 1)
    },
    // 设置购物车
    setCart (state, payload) {
      // payload为空数组,清空购物车,为有值就是设置
      state.list = payload
    }
  },
  actions: {
    // 合并购物车
    async mergeCart (context) {
      const cartList = context.state.list.map(goods => {
        return {
          skuId: goods.skuId,
          selected: goods.selected,
          count: goods.count
        }
      })
      await mergeCart(cartList)
      //  合并成功,清空本地购物车
      context.commit('setCart', [])
    },
    // 修改规格
    updateCartSku (context, { oldSkuId, newSku }) {
      return new Promise((resolve, reject) => {
        if (context.rootState.user.profile.token) {
        // 已登录
        // 1.找出旧的商品信息
        // 2.删除旧商品数据
        // 3.商品原先的数量加上新的skuId
        // 4.田间新的商品
          const oldGoods = context.state.list.find(item => item.skuId === oldSkuId)
          deleteCart([oldGoods.skuId]).then(() => {
            return insertCart({ skuId: newSku.skuId, count: oldGoods.count })
          }).then(() => {
            return findCart()
          }).then(data => {
            context.commit('setCart', data.result)
            resolve()
          })
        } else {
        // 未登录
        // 1.找出旧的商品信息
        // 2.删除旧商品数据
        // 3.根据新的spu信息和旧的商品信息合并成一条新的购物车商品
        // 4.田间新的商品
          const oldGoods = context.state.list.find(item => item.skuId === oldSkuId)
          context.commit('deleteCart', oldSkuId)
          const { skuId, price: nowPrice, specsText: attrsText, inventory: stock } = newSku
          const newGoods = { ...oldGoods, skuId, nowPrice, attrsText, stock }
          context.commit('insertCart', newGoods)
          resolve()
        }
      })
    },
    // 批量删除
    batchDeleteCart (context, isClear) {
      return new Promise((resolve, reject) => {
        if (context.rootState.user.profile.token) {
        // 已登录
          const ids = context.getters[isClear ? 'invalidList' : 'selectedList'].map(item => {
            return item.skuId
          })
          deleteCart(ids).then(() => {
            return findCart()
          }).then(data => {
            context.commit('setCart', data.result)
            resolve()
          })
        } else {
        // 未登录
          // 找出选中的商品列表，遍历调用mutations方法
          // isClear 为 true 删除失败商品列表, 否则是选中的商品
          context.getters[isClear ? 'invalidList' : 'selectedList'].forEach(item => {
            context.commit('deleteCart', item.skuId)
          })
          resolve()
        }
      })
    },
    // 全选与取消全选
    checkAllCart (context, selected) {
      return new Promise((resolve, reject) => {
        if (context.rootState.user.profile.token) {
        // 已登录
          const ids = context.getters.validList.map(item => item.skuId)
          checkAllCart({ selected, ids }).then(() => {
            return findCart()
          }).then(data => {
            context.commit('setCart', data.result)
            resolve()
          })
        } else {
        // 未登录
          context.getters.validList.forEach(item => {
            context.commit('updateCart', { skuId: item.skuId, selected })
          })
          resolve()
        }
      })
    },
    // 修改购物车(选中状态，数量)
    updateCart (context, payload) {
      return new Promise((resolve, reject) => {
        if (context.rootState.user.profile.token) {
        // 已登录
          updateCart(payload).then(() => {
            return findCart()
          }).then(data => {
            context.commit('setCart', data.result)
            resolve()
          })
        } else {
        // 未登录
          context.commit('updateCart', payload)
          resolve()
        }
      })
    },

    // 删除购物车
    deleteCart (context, payload) {
      // 单挑删除 payload就是 skuId
      return new Promise((resolve, reject) => {
        if (context.rootState.user.profile.token) {
          // 已登录
          deleteCart([payload]).then(() => {
            return findCart()
          }).then(data => {
            context.commit('setCart', data.result)
            resolve()
          })
        } else {
          // 未登录
          // 单挑删除
          context.commit('deleteCart', payload)
          resolve()
        }
      })
    },
    // 加入购物车
    insertCart (context, payload) {
      return new Promise((resolve, reject) => {
        if (context.rootState.user.profile.token) {
          // 已登录
          insertCart({ skuId: payload.skuId, count: payload.count }).then(() => {
            return findCart()
          }).then(data => {
            context.commit('setCart', data.result)
            resolve()
          })
        } else {
          // 未登录
          context.commit('insertCart', payload)
          resolve()
        }
      })
    },
    // 获取商品列表
    findCart (context) {
      return new Promise((resolve, reject) => {
        if (context.rootState.user.profile.token) {
          // 已登录
          findCart().then(data => {
            context.commit('setCart', data.result)
            resolve()
          })
        } else {
          // 未登录
          // 同时发送请求(有几个商品发几个请求,等所有请求成功,一并修改本地数据)
          // promise.all(promise数组).tehn (dataList => {})  同时发送请求,所有请求成功,得到所有成功结果
          // Promise.resolve()   Promise.reject()  new Promise(
          // Promise.race().then(data => {})  同时发请求,最快的成功，得到成功结果
          const promiseArr = context.state.list.map(goods => {
            return getNewCartGoods(goods.skuId)
          })
          Promise.all(promiseArr).then(results => {
            console.log(results)
            results.forEach((item, i) => {
              context.commit('updateCart', { skuId: context.state.list[i].skuId, ...item.result })
            })
            // 更新本地购物车
            // 调用resolve代表操作成功
            resolve()
          })
        }
      })
    }
  }
}
